<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0059)http://203.162.17.98/weblh/suutam/2002/vovisoft/msnet/3.htm -->
<HTML><HEAD><TITLE>Bài 3</TITLE>
<META http-equiv=Content-Language content=en-us>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META content="Le Hoan" name=Author>
<META content="MSHTML 5.50.4134.100" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<META 
content="computer, software, games, vietnam, viet nam, tin hoc, le hoan, pclehoan, ktlehoan, vietnamese, download, saigon, freeware, lehoanpc, mailing list, may tinh, phan cung, phan mem, kien thuc, hop thu, internet, weblh, unicode, Forum, chat, diendan, dien dan" 
name=keywords>
<META 
content="Pho bien kien thuc, huong dan su dung phan cung, phan mem may tinh, game. Download software free. Link website Vietnam, forum, chat, mailing list..." 
name=description></HEAD>
<BODY>
<CENTER>
<P><A href="http://www.vovisoft.com/"><IMG height=77 alt="Logo of Vovisoft" 
src="3_files/vs-logo4_10.gif" width=102 border=0> </A><FONT face=Tahoma></P>
<H2><FONT face=Tahoma color=#800000>Bài 3</FONT></H2>
<TABLE id=AutoNumber1 style="BORDER-COLLAPSE: collapse" borderColor=#111111 
cellSpacing=0 cellPadding=4 width="60%" border=1>
  <TBODY>
  <TR>
    <TD align=middle width="100%"><FONT face=Tahoma><SPAN lang=en-au><FONT 
      size=2><FONT color=#ff0000>Xin cáo lỗi:</FONT> rất tiếc là server chúng 
      tôi không cho phép chứa các files MP3 nên chúng tôi sẽ tìm cách khác để 
      cho đọc giả download sau. Nếu các bạn có ý kiến hay về cách cho download 
      các MP3 files này thì xin liên lạc với <A 
      href="mailto:dixon@vovisoft.com">webmaster</A>.</FONT></SPAN></FONT></TD></TR></TBODY></TABLE>
<TABLE id=AutoNumber1 style="BORDER-COLLAPSE: collapse" borderColor=#111111 
cellSpacing=0 cellPadding=4 width="60%" border=1>
  <TBODY>
  <TR>
    <TD align=middle width="50%"><B><SPAN lang=en-au><FONT size=2>Thu âm bài 
      giảng (MP3) </FONT></SPAN></B></TD>
    <TD align=middle width="50%"><B><SPAN lang=en-au><FONT size=2>download 
      size</FONT></SPAN></B></TD></TR>
  <TR>
    <TD align=middle width="50%"><SPAN lang=en-au><FONT size=2><A 
      href="http://www.vovisoft.com/dotNET/Bai03/mp3/wk3_1.mp3">Week 
      3.1</A><BR><A 
      href="http://www.vovisoft.com/dotNET/Bai03/mp3/wk3_2.mp3">Week 
      3.2</A><BR></FONT></SPAN><FONT face=Tahoma><SPAN lang=en-au><FONT 
      size=2><A href="http://www.vovisoft.com/dotNET/Bai03/mp3/wk3_3.mp3">Week 
      3.3</A><BR><A 
      href="http://www.vovisoft.com/dotNET/Bai03/mp3/wk3_4.mp3">Week 
      3.4</A><BR><A 
      href="http://www.vovisoft.com/dotNET/Bai03/mp3/wk3_5.mp3">Week 
      3.5</A><BR><A 
      href="http://www.vovisoft.com/dotNET/Bai03/mp3/wk3_6.mp3">Week 
      3.6</A><BR><A 
      href="http://www.vovisoft.com/dotNET/Bai03/mp3/wk3_7.mp3">Week 
      3.7</A><BR><A 
      href="http://www.vovisoft.com/dotNET/Bai03/mp3/wk3_8.mp3">Week 
      3.8</A></FONT></SPAN></FONT><BR><FONT face=Tahoma><SPAN lang=en-au><FONT 
      size=2><A href="http://www.vovisoft.com/dotNET/Bai03/mp3/wk3_9.mp3">Week 
      3.9</A><BR><A 
      href="http://www.vovisoft.com/dotNET/Bai03/mp3/wk3_10.mp3">Week 
      3.</A></FONT></SPAN></FONT><SPAN lang=en-au><FONT size=2><A 
      href="http://www.vovisoft.com/dotNET/Bai03/mp3/wk3_10.mp3">10</A></FONT></SPAN></TD>
    <TD align=middle width="50%"><SPAN lang=en-au><FONT size=2>1.2 mb<BR>1.2 
      mb<BR>1.2 mb<BR></FONT><FONT face=Tahoma size=2>1.2 mb<BR>1.2 mb<BR>1.2 
      mb</FONT><FONT size=2><BR></FONT><FONT face=Tahoma size=2>1.2 mb<BR>1.2 
      mb<BR>1.0 mb<BR></FONT><FONT size=2>0.8 </FONT></SPAN><FONT 
      face=Tahoma><SPAN lang=en-au><FONT face=Tahoma 
      size=2>mb</FONT></SPAN></FONT></TD></TR></TBODY></TABLE>
<H2><FONT face=Tahoma color=#800000>Những khác biệt giữa VB.NET với 
VB6</FONT></H2></CENTER></FONT><FONT face=Arial>
<BLOCKQUOTE>
  <BLOCKQUOTE>
    <P align=justify><FONT color=green size=2>V</FONT><FONT size=2> B.NET, còn 
    gọi là VB7, chẳng qua là C# viết theo lối Visual Basic. Nay VB7 đã hoàn toàn 
    là <B>Object Oriented</B>, tức là cho ta dùng lại (<B>reuse</B>) 
    classes/forms theo cách thừa kế thật thoải mái, nên nó khác VB6 nhiều 
    lắm.</FONT></P>
    <P align=justify><FONT size=2>Dầu vậy, đối với VB6 programmers học VB.NET 
    không khó. Lý do là VB.NET không cho thêm nhiều từ mới (<B>reserved 
    words</B>). Nói chung các ý niệm mới trong VB.NET đều dễ lĩnh hội, nhất là 
    khi đem ra áp dụng cách thực tế. Đó là nhờ Microsoft vẫn giữ nguyên tắc 
    <B>dấu và làm sẵn</B> (của VB6) những gì rắc rối phía sau sân khấu, để ta có 
    thể tập trung vào việc tìm kiếm một giải pháp, thay vì quá bận tâm vào cách 
    thức làm một việc gì. Chính nguyên tắc ấy đã giúp Microsoft chiêu mộ được 3 
    triệu VB6 programmers trên khắp thế giới. VB.NET cống hiến cho VB 
    programmers một công cụ rất hữu hiệu để dùng cho mọi hoàn cảnh, từ database, 
    desktop, distributed, internet cho đến real-time hay mobile (pocket PC). 
    <BR><BR>Những ưu điểm (features) của VB.NET đến từ chức năng của <B>.NET 
    Framework</B>. Nó mang đến phương tiện lập trình cho mạng cách Object 
    Oriented như XML, Remoting, Streaming, Serialisation, Threading .v.v... 
    Những thứ nầy tuy lạ nhưng không khó học, ngược lại sẽ tiết kiệm rất nhiều 
    thì giờ.<BR><BR>Mặc dầu VB6 là một ngôn ngữ lập trình trưởng thành và hiệu 
    năng, chắc chắn hãy còn tồn tại trong nhiều năm nữa, nhưng học thêm VB.NET 
    là một đầu tư tương đối ít tốn kém và đảm bảo huê lợi gấp bao nhiêu lần 
    trong hàng thập niên tới.<BR><BR>Trong bài nầy ta sẽ bàn về những điểm khác 
    nhau giữa VB6 và VB.NET từ quan điểm ngôn ngữ lập trình. Trong một bài khác 
    ta sẽ bàn về những chức năng Đối tượng (Object Oriented) của 
    VB.NET.<BR><BR></FONT><FONT color=green size=2>Namespaces</FONT></P>
    <P align=justify><B><FONT size=2>Namespaces</FONT></B><FONT size=2> là một 
    cách đặt tên để giúp sắp đặt các Classes ta dùng trong program một cách thứ 
    tự hầu dễ tìm kiếm chúng. Tất cả code trong .NET, viết bằng VB.NET, C# hay 
    ngôn ngữ nào khác, đều được chứa trong một namespace.<BR><BR>Điểm nầy cũng 
    áp dụng cho code trong .NET system class libraries. Chẳng hạn, các classes 
    của WinForms đều nằm trong System.Windows.Forms namespace. Và các classes 
    dùng cho collections như Queue, Stack, Hashtable .v.v.. đều nằm trong 
    System.Collections namespace.<BR><BR>Tất cả code ta viết trong program của 
    mình cũng đều nằm trong các namespaces.<BR><BR>Trước đây trong VB6, mỗi khi 
    nhắc đến một Class trong một COM tên <B>CompName</B> ta viết 
    <B>CompName.classname</B> (còn gọi là PROGID) , tức là cũng dùng một dạng 
    namespace. Tuy nhiên phương pháp nầy có một vài giới hạn:</FONT></P>
    <UL>
      <LI>
      <P align=justify><FONT size=2>Địa chỉ của class bị buộc cứng vào component 
      đang chứa nó. </FONT></P>
      <LI>
      <P align=justify><FONT size=2>Những classes không nằm trong một COM 
      component thì không có "namespace". </FONT></P>
      <LI>
      <P align=justify><FONT size=2>Cách gọi tên PROGID chỉ có một bậc thôi, 
      không có bậc con, bậc cháu. </FONT></P>
      <LI>
      <P align=justify><FONT size=2>Tên của Component luôn luôn có hiệu lực trên 
      khắp cả computer. </FONT></P></LI></UL>
    <P align=justify><FONT size=2>Namespaces trong .NET khắc phục được mọi giới 
    hạn nói trên trong VB6.<BR><BR>Nhiều <B>assemblies</B> có thể nằm trong cùng 
    một namespace, nghĩa là classes tuyên bố trong các components khác nhau có 
    thể có chung một namespace. Điều nầy cũng áp dụng xuyên qua các ngôn ngữ, 
    giúp cho một class viết trong VB.NET có thể nằm trong cùng một namespace với 
    một class viết trong C#, chẳng hạn.<BR><BR>Hơn nữa, trong một assembly có 
    thể có nhiều namespaces, dù rằng thông thường ta chỉ dùng một namespace duy 
    nhất cho tất cả các classes trong ấy.</FONT></P>
    <BLOCKQUOTE>
      <P align=justify><I><FONT size=2>Nhớ là một assembly trong .NET thì đại 
      khái tương đương với một COM component.<BR>Tất cả code trong .NET đều nằm 
      trong những assemblies.</FONT></I></P></BLOCKQUOTE>
    <P align=justify><FONT size=2>By default, tên của project được dùng làm 
    namespace. Nếu bạn right click lên project name <B>NETListbox</B> trong 
    Solution Explorer của program Demo, rồi chọn <B>Properties</B> trong popup 
    menu, IDE sẽ hiển thị Property Pages dialog như dưới đây:</FONT></P>
    <BLOCKQUOTE>
      <P align=justify><FONT size=2><IMG height=432 
      src="3_files/rootnamespace.gif" width=664></FONT></P></BLOCKQUOTE>
    <P align=justify><FONT size=2>Bạn thấy <B>Root namespace</B> của project là 
    <B>NETListbox</B>. Bạn có thể thay đổi tên namespace ấy nếu bạn 
    muốn.<BR><BR>Namespaces có thể được phân chia thứ bậc giống như Folders 
    trong một File Directory. Nó sẽ giúp user sắp đặt các classes theo đúng nhóm 
    cho trong sáng và dễ đọc. Thí dụ bạn đang viết một program cho một hảng sản 
    xuất, bạn sẽ dùng namespace <B>NhàSảnXuất</B> ở root level. Bên trong 
    namespace ấy bạn sẽ tạo thêm các nhánh của chương trình 
    như:</FONT></FONT><FONT face=Tahoma><B></P><FONT face=Arial>
    <UL>
      <LI>
      <P align=justify><FONT size=2>NhàSảnXuất.TồnKho </FONT></P>
      <LI>
      <P align=justify><FONT size=2>NhàSảnXuất.SảnPhẩm </FONT></P>
      <LI>
      <P align=justify><FONT size=2>NhàSảnXuất.KếToán.ChiPhí </FONT></P>
      <LI>
      <P align=justify><FONT size=2>NhàSảnXuất.KếToán.ThuNhập 
    </FONT></P></LI></UL></FONT></B><FONT face=Arial>
    <P align=justify><FONT size=2>Như thế ta đã định nghĩa một base namespace 
    tên <B>NhàSảnXuất</B>, với những namespaces con, cháu bên trong, mỗi 
    namespace có chứa classes, modules, enums, structures và các namespaces 
    khác.<BR><BR>Mỗi namespace chứa những phần của code thích hợp cho nó trong 
    program nói chung. Trong File Directory, ta có thể có hai files dù mang cùng 
    tên nhưng nằm trong hai folders khác nhau. Giống như vậy, trong .NET ta có 
    thể có hai classes có cùng một tên nhưng nằm trong hai namespaces khác nhau. 
    Đó là vì khi ta viết tên của một class với cả namespace của nó thì có thể 
    phân biệt với một class khác với cùng tên.</FONT></P>
    <H3 align=justify><FONT color=blue size=2>Local và Global 
    Namespaces</FONT></H3>
    <P align=justify><FONT size=2>Khác với COM components với "namespace" của 
    chúng áp dụng cho khắp cả computer, namespaces của .NET thông thường là 
    <B>Local</B>, chỉ có application program của nó thấy mà thôi. .NET cũng hổ 
    trợ <B>Global</B> namespace, nhưng phải được ký tên (digitally signed) và 
    đăng ký với .NET runtime để chứa nó trong global assembly cache.<BR>Công 
    việc làm một namespace Global rắc rối như thế để giảm thiểu trường hợp ta 
    trở về tình trạng <B>DLL hell</B> trước đây.</FONT></P>
    <H3 align=justify><FONT color=blue size=2>Dùng Namespaces</FONT></H3>
    <P align=justify><FONT size=2>Ta có thể dùng namespaces bằng cách nói thẳng 
    ra (explicitly) với nguyên tên (Direct Addressing) hay hàm ý (implicitly) 
    với Import keyword. Nhưng điều tiên quyết là ta phải reference cái assembly 
    chứa namespace mà ta muốn dùng. Ta thực hiện việc ấy với Menu command 
    <B>Project | Add References</B>. Khi <B>Add References</B> dialog hiện ra, 
    chọn Tab <B>.NET</B> cho standard .NET components hay Tab <B>Projects</B> 
    cho DLL của một .NET project khác , highlight DLL bạn muốn rồi click 
    <B>Select</B> button, đoạn click <B>OK</B>.</FONT></P>
    <BLOCKQUOTE>
      <P align=justify><FONT size=2><IMG height=446 src="3_files/AddRefCom.gif" 
      width=566></FONT></P></BLOCKQUOTE>
    <P align=justify><FONT size=2>Chẳng hạn ta muốn read và write từ stdio (cái 
    console input/output stream). Cái namespace ta cần sẽ là 
    <B>System.Console</B>. Trong cách <B>Direct Addressing</B> ta sẽ code như 
    sau để viết hàng chữ "Chào thế giới":</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial>System.Console.WriteLine ("Hello world!") 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Nếu ta dùng <B>Import keyword</B> bằng cách nhét vào câu 
    <B>Imports System.Console</B> ở đầu code module, ta có thể code gọn 
    hơn:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial>WriteLine ("Hello world!") 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Dưới đây là một số namespaces thông 
    dụng:</FONT></P>
    <TABLE cellPadding=5 border=2>
      <TBODY>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>Namespace</FONT></B></P></TD>
        <TD>
          <P align=justify><B><FONT size=2>Chức năng</FONT></B></P></TD>
        <TD>
          <P align=justify><B><FONT size=2>Classes điển 
hình</FONT></B></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><FONT size=2>System.IO </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Đọc/Viết files và các data streams khác 
          </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>FileStream, Path, StreamReader, 
          StreamWriter </FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><FONT size=2>System.Drawing </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Đồ họa </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Bitmap, Brush, Pen Color, Font, Graphics 
          </FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><FONT size=2>System.Data </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Quản lý data </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>DataSet, DataTable, DataRow, 
          SQLConnection, ADOConnection </FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><FONT size=2>System.Collection </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Tạo và quản lý các loại collections 
          </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>ArrayList, BitArray, Queue, Stack, 
          HashTable </FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><FONT size=2>System.Math </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Tính toán </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Sqrt, Cos, Log, Min </FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><FONT size=2>System.Diagnostics </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Debug </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Debug, Trace </FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><FONT size=2>System.XML </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Làm việc với XML, Document Object Model 
          </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>XMLDocument, XMLElement, XMLReader, 
          XMLWriter </FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><FONT size=2>System.Security </FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Cho phép kiểm soát an ninh 
</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Cryptography, Permission, Policy 
          </FONT></P></TD></TR></TBODY></TABLE>
    <H3 align=justify><FONT color=blue size=2>Aliasing Namespaces (dùng bí 
    danh)</FONT></H3>
    <P align=justify><FONT size=2>Khi hai namespaces trùng tên, ta phải dùng 
    nguyên tên (kể cả gốc tích) để phân biệt chúng. Điển hình là khi ta dùng 
    những namespaces liên hệ đến VB6 như <B>Microsoft.Visualbasic</B>. Thay vì 
    code:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial>Microsoft.Visualbasic.Left ( InputString,6) 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>ta tuyên bố:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Imports</FONT> VB6= Microsoft.Visualbasic 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Sau đó ta có thể code:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial>VB6.Left ( InputString,6) 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H3 align=justify><FONT color=blue size=2>Dùng Namespaces 
keyword</FONT></H3>
    <P align=justify><FONT size=2>Trong thí dụ về program có Root Namespace là 
    NhàSảnXuất như nói trên, nếu ta muốn đặt ra một namespace con là TồnKho, ta 
    phải dùng NameSpace keyword trong code như sau:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=green>' Root Namespace là NhàSảnXuất</FONT>
<FONT color=blue>Namespace</FONT> TồnKho <BR>
<FONT color=blue>  Class</FONT> PhòngLạnh 
<FONT color=green>   ' Code cho Phòng Lạnh</FONT>
<FONT color=blue>  End</FONT> <FONT color=blue>Class</FONT> <BR>
<FONT color=blue>End</FONT> <FONT color=blue>Namespace</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Bây giờ muốn nói đến class PhòngLạnh bên trong 
    namespace TồnKho ta sẽ code như sau:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;<B> 
    NhàSảnXuất.TồnKho.PhòngLạnh</B></FONT></P>
    <H2 align=justify><FONT color=green size=2>Thay đổi trong Data 
    Types</FONT></H2>
    <H3 align=justify><FONT color=blue size=2>Tất cả đều là Object</FONT></H3>
    <P align=justify><FONT size=2>Một thay đổi lớn cho Data Type của VB.NET, là 
    những variables dùng Data Type địa phương như Integer, Single, 
    Boolean,.v.v.. đều là những Objects. Chúng đều được derived (xuất phát) từ 
    Class căn bản nhất tên <B>Object</B> trong VB.NET. Nếu bạn thử dùng 
    Intellisense để xem có bao nhiêu Functions/Properties một Object loại 
    Integer có, bạn sẽ thấy như dưới đây:</FONT></P>
    <BLOCKQUOTE>
      <P align=justify><FONT size=2><IMG height=203 
      src="3_files/IntegerObject.gif" width=275></FONT></P></BLOCKQUOTE>
    <P align=justify><FONT size=2>Trong .NET, Integer có bốn loại: <B>Byte</B> 
    (8 bits, không có dấu, tức là từ 0 đến 255), <B>Short</B> (16 bits, có dấu 
    cộng trừ, tức là từ -32768 đến 32767), <B>Integer</B> (32 bits, có dấu) và 
    <B>Long</B> (64 bits, có dấu). Như vậy Integer bây giờ tương đương với Long 
    trong VB6, và Long bây giờ lớn gấp đôi trong VB6.</FONT></P>
    <H3 align=justify><FONT color=blue size=2>Floating-Point Division (Chia số 
    nổi)</FONT></H3>
    <P align=justify><FONT size=2>Việc chia số nổi (Single, Double) trong VB.NET 
    được làm theo đúng tiêu chuẩn của IEEE. Do đó nếu ta viết code như 
    sau:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> dValueA <FONT color=blue>As</FONT> <FONT color=blue>Double</FONT> 
<FONT color=blue>Dim</FONT> dValueB <FONT color=blue>As</FONT> <FONT color=blue>Double</FONT> 
dValueA = 1 
dValueB = 0 
Console.WriteLine(dValueA / dValueB) 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Trong VB6 ta biết mình sẽ gặp <B>Division by Zero</B> 
    error, nhưng ở đây program sẽ viết trong Output Window chữ <B>Infinity</B> 
    (vô cực). Tương tự như vậy, nếu ta viết code:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> dValueA <FONT color=blue>As</FONT> <FONT color=blue>Double</FONT> 
<FONT color=blue>Dim</FONT> dValueB <FONT color=blue>As</FONT> <FONT color=blue>Double</FONT> 
dValueA = 0 
dValueB = 0 
Console.WriteLine(dValueA / dValueB) 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Kết quả sẽ là chữ <B>NaN</B> (Not a Number) 
    hiển thị trong Output Window. </FONT></P>
    <H3 align=justify><FONT color=blue size=2>Thay thế Currency bằng 
    Decimal</FONT></H3>
    <P align=justify><FONT size=2>VB.NET dùng Decimal data type với 128 bits để 
    thay thế Currency data type trong VB6. Nó có thể biểu diễn một số tới 28 
    digits nằm bên phải dấu chấm để cho thật chính xác. Hể càng nhiều digits nằm 
    bên phải dấu chấm thì tầm trị số của Decimal càng nhỏ hơn.</FONT></P>
    <H3 align=justify><FONT color=blue size=2>Char Type</FONT></H3>
    <P align=justify><FONT size=2>VB.NET có cả <B>Byte</B> lẫn <B>Char</B> data 
    type. Byte được dùng cho một số nhỏ 0-255, có thể chứa một ASCII character 
    trong dạng con số.<BR><BR>Char được dùng để chứa một Unicode (16 bit) 
    character. Char là một character của String.</FONT></P>
    <H3 align=justify><FONT color=blue size=2>String Type</FONT></H3>
    <P align=justify><FONT size=2>Nhìn lướt qua, String trong VB.NET không có vẻ 
    khác VB6 bao nhiêu. Nhưng trừ khi ta muốn tiếp tục dùng các Functions như 
    InStr, Left, Mid and Right trong VB6, ta nên xem String là một object và 
    dùng những Properties/Functions của nó trong VB.NET cho tiện hơn. Sau nầy ta 
    sẽ học thêm về String của VB.NET trong một bài riêng.<BR><BR>Ý niệm 
    fixed-length (có chiều dài nhất định) String trong VB6 không còn dùng nữa. 
    Do đó ta không thể declare:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> myString <FONT color=blue>As String</FONT> * 25 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H3 align=justify><FONT color=blue size=2>Object thay thế 
Variant</FONT></H3>
    <P align=justify><FONT size=2>Một trong những data types linh động, hiệu 
    năng và nguy hiểm trong VB6 là <B>Variant</B>. Một variable thuộc data type 
    Variant có thể chứa gần như thứ gì cũng được (trừ fixed-length string), nó 
    tự động thích nghi bên trong để chứa trị số mới. Cái giá phải trả cho sự 
    linh động ấy là program chạy chậm và dễ có bugs tạo ra bởi sự biến đổi từ 
    data loại nầy qua loại khác không theo dự tính của ta.<BR><BR>VB.NET thay 
    thế Variant bằng <B>Object</B>. Vì trên phương diện kỹ thuật tất cả data 
    types trong .NET đều là Object nên, giống như Variant, Object có thể chứa đủ 
    thứ.<BR><BR>Nói chung, dầu Object giống như Variant, nhưng trong .NET ta 
    phải nói rõ ra (explicitly) mình muốn làm gì. Ta thử xem một thí dụ code 
    trong VB6 như sau:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> Button1_Click() 
   <FONT color=blue>Dim</FONT> X1 <FONT color=blue>As</FONT> <FONT color=blue>Variant</FONT> 
   <FONT color=blue>Dim</FONT> X2 <FONT color=blue>As</FONT> <FONT color=blue>Variant</FONT> 
   X1 = "24.7" 
   X2 = 5 
   Debug.Print X1 + X2   ' Cộng hai số với operator <B>+</B>
   Debug.Print X1 &amp; X2   ' Ghép hai strings lại với operator <B>&amp;</B>
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Kết quả hiển thị trong Immediate Window là : </P></FONT>
    <DIV align=justify><PRE><FONT face=Arial><B>    29.7
    24.75</B></FONT></PRE></DIV><FONT face=Arial size=2>
    <P align=justify>Trong VB.NET, ta phải code cho rõ ràng hơn như sau để có 
    cùng kết quả như trên hiển thị trong Output Window:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> Button1_Click(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> Button1.Click 
   <FONT color=blue>Dim</FONT> X1 <FONT color=blue>As</FONT> Object 
   <FONT color=blue>Dim</FONT> X2 <FONT color=blue>As</FONT> Object 
   X1 = "24.7" 
   X2 = 5 
   Console.WriteLine(CSng(X1) + CInt(X2)) 
   Console.WriteLine(CStr(X1) &amp; CStr(X2)) 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H3 align=justify><FONT color=blue size=2>CType Statement</FONT></H3>
    <P align=justify><FONT size=2>Trong VB.NET có <B>Option Strict</B> by 
    default. Nó bắt ta phải thận trọng trong cách dùng data types. Vì Object có 
    thể chứa bất cứ thứ gì, khi ta muốn dùng nó như một loại data type hay class 
    nào, ta phải đổi Object ra thứ ấy bằng <B>CType</B>, thí 
    dụ:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Class</FONT> Product 
<FONT color=blue>   Public</FONT> Description <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Class</FONT><BR> 
<FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> Button1_Click(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> Button1.Click 
   <FONT color=blue>Dim</FONT> X <FONT color=blue>As</FONT> Object 
   X = <FONT color=blue>New</FONT> Product() 
   <FONT color=green>' Treat X like an actual product</FONT>
   CType(X, Product).Description = "Soft Drink" 
   Console.WriteLine(CType(X, Product).Description) 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Mặc dù X được instantiated như một Product, nó 
    vẫn được xem như một Object variable. Do đó mỗi khi muốn dùng nó như một 
    Product ta phải nhờ đến CType. Từ chuyên môn trong programming gọi đó là 
    <B>Type Casting</B>.</FONT></P>
    <H2 align=justify><FONT color=green size=2>Thay đổi trong cách tuyên bố 
    Variables</FONT></H2>
    <H3 align=justify><FONT color=blue size=2>Tuyên bố nhiều 
    Variables</FONT></H3>
    <P align=justify><FONT size=2>Trong VB6 ta có thể Declare nhiều variables 
    trên cùng một hàng như:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> i, j, k <FONT color=blue>As Integer</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Kết quả là chỉ có k là Integer, còn i và j là 
    Variant (có thể đó là điều bạn không ngờ). Trong VB.NET thì cả ba i,j và k 
    đều là Integer, và như thế hợp lý hơn.</FONT></P>
    <H3 align=justify><FONT color=blue size=2>Tuyên bố trị số khởi 
    đầu</FONT></H3>
    <P align=justify><FONT size=2>Trong VB6, sau khi declare variable ta thường 
    cho nó một trị số khởi đầu như: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> X <FONT color=blue>As Integer</FONT> 
X = 12 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Bây giờ trong VB.NET ta có thể gọp chung hai statements 
    trên lại như sau: </P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> X <FONT color=blue>As Integer</FONT> = 12 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H3 align=justify><FONT color=blue size=2>Tuyên bố Constants</FONT></H3>
    <P align=justify><FONT size=2>Khi tuyên bố Constants trong VB.NET ta phải 
    khai rõ Data type của nó là String, Integer, Boolean ..v.v.: 
    </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Const</FONT> myConstantString <FONT color=blue>As String</FONT> = "happy" 
<FONT color=blue>Public</FONT> <FONT color=blue>Const</FONT> maxStudent <FONT color=blue>As Integer</FONT> = 30 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H3 align=justify><FONT color=blue size=2>Dim As New</FONT></H3>
    <P align=justify><FONT size=2>Trong VB6 ta được khuyên <I>không nên</I> 
    code: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> X <FONT color=blue>As New</FONT> Customer 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>vì VB6 không instantiate một Object Customer cho đến khi X 
    được dùng đến - chuyện nầy rất nguy hiểm vì có thể tạo ra bug mà ta không 
    ngờ.<BR><BR>Trong VB.NET ta có thể yên tâm code: </P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> X <FONT color=blue>As New</FONT> Customer()
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>vì statement nói trên lập tức tạo ra một 
    Object Customer. </FONT></P>
    <H3 align=justify><FONT color=blue size=2>Tuyên bố Variable trong Scope của 
    Block</FONT></H3>
    <P align=justify><FONT size=2>Trong thí dụ dưới đây, variable X được 
    declared trong một IF ..THEN...END IF block. Khi execution ra khỏi IF block 
    ấy, X sẽ bị hủy diệt.<BR>Do đó, VB.NET sẽ than phiền là X <B>undefined</B> 
    vì nó không thấy X bên ngoài IF block. Luật nầy cũng áp dụng cho những 
    Blocks khác như DO...LOOP, WHILE...END WHILE, FOR...NEXT, 
    .v.v..</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Private</FONT> <FONT color=blue>Sub</FONT> Button1_Click(<FONT color=blue>ByVal</FONT> sender <FONT color=blue>As</FONT> System.Object, <FONT color=blue>ByVal</FONT> e <FONT color=blue>As</FONT> System.EventArgs) <FONT color=blue>Handles</FONT> Button1.Click 
   <FONT color=blue>Dim</FONT> A <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> = 5 
   <FONT color=blue>Dim</FONT> B <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> = 5 
   <FONT color=blue>If</FONT> A = B <FONT color=blue>Then</FONT> 
      <FONT color=blue>Dim</FONT> X <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT>  <FONT color=green>' X is declared in this IF block </FONT>
      X = 12 
   <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
   A = X    <FONT color=green>' X has been destroyed, so it is undefined here</FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Có lẽ bạn hỏi Declare Variable trong 
    FOR...LOOP có lợi gì, tại sao ta không Declare một lần duy nhất ở 
    đầu?<BR>Thứ nhất là Block giới hạn scope (phạm vi hoạt động) của một 
    variable để nó không đụng chạm ai dễ gây nên bug, thứ hai là trường hợp điển 
    hình ta sẽ cần feature nầy là trong một FOR...LOOP, cứ mỗi iteration ta muốn 
    instantiate một Object mới. Khi ấy ta cần Declare một Object variable, 
    instantiate Object , rồi chứa nó vào một collection chẳng hạn.</FONT></P>
    <H3 align=justify><FONT color=blue size=2>Truy cập 
    Variable/Class/Structure</FONT></H3>
    <P align=justify><FONT size=2>Trong VB.NET ta có thể quyết định giới hạn 
    việc truy cập một Variable, Class, Structure .v.v. bằng cách dùng các 
    keywords sau:</FONT></P>
    <TABLE cellPadding=5 border=2>
      <TBODY>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>Loại truy cập</FONT></B></P></TD>
        <TD>
          <P align=justify><B><FONT size=2>Thí dụ</FONT></B></P></TD>
        <TD>
          <P align=justify><B><FONT size=2>Chú thích</FONT></B></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>Public</FONT></B></P></TD>
        <TD>
          <P align=justify><B><FONT size=2>Public Class ClassForEverybody 
          </FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Cho phép ở đâu cũng dùng nó được. Ta chỉ 
          có thể dùng Public ở mức độ Module, Namespace hay File. Tức là ta 
          không thể dùng Public trong một Sub/Function.</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>Protected</FONT></B></P></TD>
        <TD>
          <P align=justify><B><FONT size=2>Protected Class ClassForMyHeirs 
          </FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Cho phép các classes con, cháu được 
          dùng. Ta chỉ có thể dùng Protected ở mức độ Class.</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>Friend</FONT></B></P></TD>
        <TD>
          <P align=justify><B><FONT size=2>Friend StringForThisProject As String 
          </FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Cho phép code trong cùng một Project 
          được dùng.</FONT></P></TD></TR>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>Private</FONT></B></P></TD>
        <TD>
          <P align=justify><B><FONT size=2>Private NumberForMeOnly As Integer 
          </FONT></B></P></TD>
        <TD>
          <P align=justify><FONT size=2>Cho phép code trong cùng module, class, 
          hay structure được dùng. Lưu ý là <B>Dim</B> coi như tương đương với 
          <B>Private</B>, do đó ta nên dùng Private cho dễ 
      đọc.</FONT></P></TD></TR></TD></TR></TBODY></TABLE>
    <P align=justify><FONT size=2>Ngoài ra, nhớ là nếu container (Object chứa) 
    của một Variable/Class/Structure là Private thì dù ta có tuyên bố một 
    Variable/Class/Structure nằm bên trong container là Public ta cũng không 
    thấy nó từ bên ngoài. </FONT></P>
    <H2 align=justify><FONT color=green size=2>Thay đổi trong Array</FONT></H2>
    <H3 align=justify><FONT color=blue size=2>Array index từ 0</FONT></H3>
    <P align=justify><FONT size=2>Trong VB.NET không có <B>Option Base</B> và 
    mọi Array đều có index bắt đầu từ 0. Khi bạn tuyên bố một array như: 
    </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> myArray(10) <FONT color=blue>As Integer</FONT>
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Kết quả là một array có 11 elements và index 
    từ 0 đến 10. UBound của array nầy là 10 và LBound của tất cả arrays trong 
    VB.NET đều là 0. </FONT></P>
    <H3 align=justify><FONT color=blue size=2>Tuyên bố Array với những trị số 
    khởi đầu</FONT></H3>
    <P align=justify><FONT size=2>Bạn có thể tuyên bố Array với những trị số 
    khởi đầu như sau: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> myArray() <FONT color=blue>As Integer</FONT> = <B>{</B> 1, 5, 8, 16 <B>}</B>  <FONT color=green>' Note the curly brackets</FONT>
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Statement làm hai chuyện: quyết định size của 
    array và cho các elements trị số khởi đầu. Để dùng feature nầy, bạn không 
    được nói rõ size của array, mà để cho program tự tính.</FONT></P>
    <H3 align=justify><FONT color=blue size=2>ReDim Preserve</FONT></H3>
    <P align=justify><FONT size=2>Trong VB.NET bạn cũng có thể tiếp tục dùng 
    <B>Preserve keyword</B> để giữ nguyên trị số của các elements trong một 
    array khi bạn <B>ReDim</B> nó. Tuy nhiên có một giới hạn cho array với hơn 
    một dimension - bạn chỉ có thể resize dimention cuối (bên phải) , nên những 
    hàng code sau đây hợp lệ: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> myArray(,) <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
<FONT color=blue>ReDim</FONT> myArray(5, 5) 
<FONT color=blue>ReDim</FONT> <FONT color=blue>Preserve</FONT> myArray(5, 8) 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H2 align=justify><FONT color=green size=2>Thay đổi trong User-Defined 
    Type</FONT></H2>
    <P align=justify><FONT size=2>Ý niệm <B>User-Defined Type (UDT)</B> rất tiện 
    cho ta gom các mảnh data liên hệ lại thành một data type có cấu trúc. Trong 
    VB6 ta dùng nó như sau: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Type</FONT> UStudent 
   FullName <FONT color=blue>As String</FONT> 
   Age <FONT color=blue>As Integer</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Type</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>VB.NET cũng giữ y đặc tính của UDT nhưng thay đổi chữ 
    <B>Type</B> thành <B>Structure</B>: </P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Public Structure</FONT> UStudent 
   <FONT color=blue>Public</FONT> FullName <FONT color=blue>As String</FONT>  
   <FONT color=blue>Public</FONT> Age <FONT color=blue>As Integer</FONT> 
<FONT color=blue>End Structure</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Lưu ý các Structure Members (như FullName , 
    Age ) cần phải được Declared với keyword Dim, Public, Private hay Friend, 
    nhưng không thể dùng Protected vì Structure không thể Inherit từ một 
    Structure khác. Sở dĩ, có dùng Private là vì bên trong Structure có thể có 
    Property, Sub/Function .v.v.. </FONT></P>
    <H2 align=justify><FONT color=green size=2>Thay đổi trong 
    Collections</FONT></H2>
    <P align=justify><FONT size=2>VB6 hổ trợ Collection và sau nầy Windows 
    Scripting Host Library cho ta collection kiểu Dictionary. VB.NET cho ta một 
    thành phần collection rất hùng hậu trong Namespace 
    <B>System.Collections</B>. Vì Collection là một trong những công cụ rất 
    thông dụng và hiệu năng trong VB.NET nên ta sẽ có một bài dành riêng cho 
    collection sau nầy.<BR><BR>Dưới đây là danh sách các collections ta sẽ dùng 
    thường xuyên:</FONT></P>
    <TABLE cellPadding=5 border=2>
      <TBODY>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>Collection</FONT></B></P></TD>
        <TD>
          <P align=justify><B><FONT size=2>Chức năng</FONT></B></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>ArrayList</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Dynamic Array tự động lớn lên khi 
          elements được bỏ vào.</FONT></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>BitArray</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Array chứa trị số Boolean 
          (True/False).</FONT></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>HashTable</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Collection chứa những cặp key-value 
          data, cho ta dùng làm tự điển.</FONT></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>Queue</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Chứa một FIFO (First In, First Out) 
          structure. Element có thể là bất cứ Object loại nào.</FONT></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>Stack</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Chứa một LIFO (Last In, First Out) 
          structure.</FONT></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>SortedList</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>Chứa một danh sách những cặp key-value 
          data được sắp theo thứ tự.</FONT></P></TD></TR></TBODY></TABLE>
    <H2 align=justify><FONT color=green size=2>Arithmetic Operators 
    mới</FONT></H2>
    <P align=justify><FONT size=2>VB.NET cho ta thêm cách viết Arithmetic 
    Operator mới mà C programmers rất thích từ lâu nay.</FONT></P></FONT>
    <TABLE bgColor=#e8e8e8 cellspace="20">
      <TBODY>
      <TR>
        <TD>
          <DIV align=justify><PRE><FONT face=Arial>     X += 4       tương đương với  X = X + 4
  Mess &amp;= " text" tương đương với  Mess = Mess &amp; " text"
</FONT></PRE></DIV></TD></TR></TBODY></TABLE><FONT face=Arial>
    <TABLE cellPadding=5 border=2>
      <TBODY>
      <TR>
        <TD>
          <P align=justify><B><FONT size=2>Arithmetic 
Operation</FONT></B></P></TD>
        <TD>
          <P align=justify><B><FONT size=2>Trong VB6</FONT></B></P></TD>
        <TD>
          <P align=justify><B><FONT size=2>Cách viết tắc mới</FONT></B></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>Cộng</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X = X +5</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X += 5</FONT></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>Trừ</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X = X - 10</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X -= 10</FONT></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>Nhân</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X = X * 7</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X *= 7</FONT></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>Chia</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X = X / 19</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X /= 19</FONT></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>Chia Integer</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X = X \ 13</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X \= 13</FONT></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>Lũy thừa</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X = X ^ 3</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X ^= 3</FONT></P></TD>
      <TR>
        <TD>
          <P align=justify><FONT size=2>Ghép Strings</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X = X &amp; "more text"</FONT></P></TD>
        <TD>
          <P align=justify><FONT size=2>X &amp;= "more 
      text"</FONT></P></TD></TR></TBODY></TABLE>
    <P align=justify><FONT size=2>Ta vẫn có thể tiếp tục dùng cách viết trong 
    VB6, nhưng bây giờ có thêm một cách viết gọn hơn. </FONT></P>
    <H2 align=justify><FONT color=green size=2>Short Circuit trong IF..THEN 
    Statement</FONT></H2>
    <P align=justify><FONT size=2>Trong VB6, nếu ta viết: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> myInt <FONT color=blue>As Integer</FONT> 
myInt = 0 
<FONT color=blue>If</FONT> (myInt &lt;&gt; 0) <FONT color=blue>And</FONT> (17 \ myInt &lt; 5 ) <FONT color=blue>Then</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Thì sẽ bị Division by Zero error, vì mặc dầu phần <B>(myInt 
    &lt;&gt;0)</B> là <B>False</B>, nhưng VB6 vẫn tiếp tục tính phần <BR><B>(17 
    \ myInt &lt; 5 )</B>, và tạo ra error vì 17 chia cho một số 0.<BR>Trong vài 
    ngôn ngữ lập trình khác, khi <B>(myInt &lt;&gt;0)</B> là <B>False</B> thì nó 
    không tính thêm nữa, tức là nó nói rằng khi một phần của <B>AND</B> là False 
    thì nhất định kết quả của Logical Statement trong IF phải là False. Ðặc tính 
    nầy gọi là <B>Short-Circuit (đi tắc)</B>.<BR><BR>Nếu ta dùng code nói trên 
    trong VB.NET, nó vẫn cho Division by Zero error giống như VB6. Tuy nhiên, 
    nếu ta muốn dùng đặc tính Short-Circuit thì ta chỉ cần thay thế chữ 
    <B>And</B> bằng <B>AndAlso</B> như sau: </P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> myInt <FONT color=blue>As Integer</FONT> 
myInt = 0 
<FONT color=blue>If</FONT> (myInt &lt;&gt; 0) <FONT color=blue>AndAlso</FONT> (17 \ myInt &lt; 5 ) <FONT color=blue>Then</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Short-Circuit cũng áp dụng cho Logical OR khi 
    ta thay thế chữ <B>Or</B> bằng <B>OrElse</B> để nói rằng khi phần đầu của 
    <B>OR</B> là True thì nhất định kết quả của Logical Statement trong IF phải 
    là True. </FONT></P>
    <H2 align=justify><FONT color=green size=2>Không còn Set statement cho 
    Object</FONT></H2>
    <P align=justify><FONT size=2>Trong VB6 ta có thể viết: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Set</FONT> x = <FONT color=blue>New</FONT> Product 
<FONT color=blue>Set</FONT> w = x 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Trong VB.NET sẽ được viết lại như sau: </P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial>x = <FONT color=blue>New</FONT> Product() 
w = x 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Bây giờ ta không cần phải nhớ dùng chữ 
    <B>Set</B> khi nói đến Object. </FONT></P>
    <H2 align=justify><FONT color=green size=2>Thay đổi trong cách viết Property 
    routines</FONT></H2>
    <H3 align=justify><FONT color=blue size=2>Dùng một Property duy 
    nhất</FONT></H3>
    <P align=justify><FONT size=2>Nếu trong VB6 ta viết: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Private</FONT> mdescription as <FONT color=blue>String</FONT> 
<FONT color=blue>Public</FONT> <FONT color=blue>Property</FONT> Let Description (Value <FONT color=blue>As String</FONT>) 
   mdescription = Value 
<FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> <BR>
<FONT color=blue>Public</FONT> <FONT color=blue>Property</FONT> Get Description() <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
   Description = mdescription 
<FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> <BR>
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Trong VB.NET <B>Let</B> và <B>Get</B> đuợc hợp lại trong 
    một Property routine duy nhất và ta lại dùng chữ <B>Set</B> thay cho chữ 
    <B>Let</B> (mặc dầu chữ Set không còn dùng cho Object như mới nói ở trên) 
    như sau: </P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Private</FONT> mdescription <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
<FONT color=blue>Public</FONT> <FONT color=blue>Property</FONT> Description() <FONT color=blue>As</FONT> <FONT color=blue>String</FONT> 
   <FONT color=blue>Set</FONT>  (<FONT color=blue>ByVal</FONT> Value <FONT color=blue>As String</FONT>) 
      mdescription = Value 
   <FONT color=blue>End</FONT> <FONT color=blue>Set</FONT> 
   <FONT color=blue>Get </FONT>
      Description = mdescription 
   <FONT color=blue>End</FONT> <FONT color=blue>Get </FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H3 align=justify><FONT color=blue size=2>ReadOnly và WriteOnly 
    property</FONT></H3>
    <P align=justify><FONT size=2>Bây giờ nếu Property là ReadOnly ta sẽ viết: 
    </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Public</FONT> ReadOnly <FONT color=blue>Property</FONT> Age() <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
<FONT color=blue>   Get</FONT> 
      Age = 3 
<FONT color=blue>   End</FONT> <FONT color=blue>Get</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>hay WriteOnly ta sẽ viết: </P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Private</FONT> _data <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
<FONT color=blue>Public</FONT> WriteOnly <FONT color=blue>Property</FONT> Data() <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
<FONT color=blue>   Set</FONT> (<FONT color=blue>ByVal</FONT> Value <FONT color=blue>As Integer</FONT>) 
      _data = Value 
<FONT color=blue>   End</FONT> <FONT color=blue>Set</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Property</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H3 align=justify><FONT color=blue size=2>Default Properties</FONT></H3>
    <P align=justify><FONT size=2>Ta dùng <B>Default keyword</B> để tạo ra 
    Default Property như sau: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Default Public</FONT> <FONT color=blue>Property</FONT> Item(<FONT color=blue>ByVal</FONT> Index <FONT color=blue>As Integer</FONT>) <FONT color=blue>As String</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>VB.NET bắt buộc ta phải ít nhất một parameter 
    cho Default Property. </FONT></P>
    <H2 align=justify><FONT color=green size=2>Dùng Reserved Word làm Procedure 
    Name</FONT></H2>
    <P align=justify><FONT size=2>Trong VB.NET ta có thể dùng Reserved Word làm 
    Procedure Name bằng cách để nó giữa ngoặc vuông. Giả tỉ ta muốn dùng chữ 
    <B>Compare</B> làm tên một Function, ta sẽ viết như sau: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Function</FONT> [Compare] (<FONT color=blue>ByVal</FONT> v1 <FONT color=blue>As Integer</FONT>, <FONT color=blue>ByVal</FONT> v2 <FONT color=blue>As Integer</FONT>) <FONT color=blue>As Boolean</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H2 align=justify><FONT color=green size=2>Structured Error 
    Handling</FONT></H2>
    <H3 align=justify><FONT color=blue size=2>TRY...CATCH...FINALLY</FONT></H3>
    <P align=justify><FONT size=2>VB.NET cho ta Structure 
    TRY...CATCH...FINALLY...END TRY để xử lý error. Thí dụ như trong bài toán 
    chia dưới đây, nếu bị <I>Division by 0 error</I> thì ta sẽ cho kết quả bằng 
    0. Dù có error hay không, program vẫn hiển thị kết quả trong Output Window 
    qua statement <B>Console.WriteLine( result)</B> trong phần <B>Finally</B>: 
    </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Try</FONT> 
   result = a / b  <FONT color=green>' if this section has error jump to Catch section</FONT>
<FONT color=blue>Catch</FONT> 
   <FONT color=green>' only get here if an error occurs between Try and Catch</FONT>
   result = 0 
<FONT color=blue>Finally</FONT> 
   <FONT color=green>' This section is optional, but is always executed whether there is an error or not</FONT>
   Console.WriteLine( result) 
<FONT color=blue>End</FONT> <FONT color=blue>Try</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>Nếu ta không code gì ở phần Catch thì có nghĩa 
    là chúng ta có Handle Error nhưng lại không làm gì hết, do đó Program sẽ 
    không té. Ngược lại, nếu ta không dùng Try..Catch, thì program sẽ 
    té.<BR><BR>Nếu muốn nhảy ra khỏi Try Structure bất cứ lúc nào ta có thể dùng 
    <B>Exit Try</B>, </FONT></P>
    <H3 align=justify><FONT color=blue size=2>Những cách CATCH error</FONT></H3>
    <P align=justify><FONT size=2>Ta có thể dùng <B>Catch</B> giống như 
    <B>Select Case</B> để có một cách xử lý cho mỗi error: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Try</FONT> 
   <FONT color=green>' Main code goes here</FONT>
<FONT color=blue>Catch</FONT> <FONT color=blue>When</FONT> Err.Number=5 
   <FONT color=green>' handle Error 5</FONT>
<FONT color=blue>Catch</FONT> 
   <FONT color=green>' handle other errors</FONT>
<FONT color=blue>End</FONT> <FONT color=blue>Try</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Ta có thể Catch Error Exception data trong một variable để 
    dùng nó như sau: </P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Catch</FONT> e as Exception 
   MessageBox.Show (e.ToString) 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Hai cách code ở trên có thể được gợp lại thành: </P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Catch</FONT> e <FONT color=blue>As</FONT> Exception <FONT color=blue>When</FONT> Err.Number = 5 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H2 align=justify><FONT color=green size=2>Thay đổi trong cách viết 
    Sub/Function</FONT></H2>
    <H3 align=justify><FONT color=blue size=2>Dùng dấu ngoặc khi gọi 
    Procedure</FONT></H3>
    <P align=justify><FONT size=2>Trong VB6, nếu không dùng keyword <B>Call</B> 
    ta không dùng dấu ngoặc khi gọi Sub. Trong VB.NET ta luôn luôn dùng cặp dấu 
    ngoặc, ngay cả khi không có parameter. Thí dụ: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial>ProcessData() 
x = <FONT color=blue>New</FONT> Customer() 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <H3 align=justify><FONT color=blue size=2>ByVal là Default cho mọi 
    Parameters</FONT></H3>
    <P align=justify><FONT size=2>Trong VB6, <B>ByRef</B> là default cho các 
    parameters passed vô Sub/Function. Tức là, Sub/Function có thể vô tình làm 
    thay thổi trị số nguyên thủy của parameter variables. <BR>Trong VB.NET, 
    <B>ByVal</B> là default cho các parameters passed vô Sub/Function. Do đó, nó 
    sẽ tránh lỗi lầm nói trên. </FONT></P>
    <H3 align=justify><FONT color=blue size=2>Optional Parameter cần có trị số 
    Default </FONT></H3>
    <P align=justify><FONT size=2>Trong VB6 ta có thể dùng <B>IsMissing</B> để 
    biết xem <B>Optional parameter</B> có hiện diện không. VB.NET đã bỏ 
    IsMissing và bắt buộc ta phải cung cấp trị số Default cho Optional parameter 
    trong phần procedure declaration giống như sau đây : </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Sub</FONT> VerifyInput (<FONT color=blue>Optional ByVal</FONT> InputData <FONT color=blue>As String</FONT>="") 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial>
    <P align=justify><FONT size=2>trong thí dụ nầy ta cho Default value của 
    Optional parameter InputData là Empty string.</FONT></P>
    <H3 align=justify><FONT color=blue size=2>Return Statement</FONT></H3>
    <P align=justify><FONT size=2>Hãy xem một thí dụ dùng Function để return một 
    Customer Object trong VB6: </FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Function</FONT> GetCustomer (<FONT color=blue>ByVal</FONT> CustID <FONT color=blue>As Long</FONT>) <FONT color=blue>As</FONT> Customer 
   <FONT color=blue>Dim</FONT> objCust <FONT color=blue>As</FONT> Customer 
   <FONT color=blue>Set</FONT> objCust = <FONT color=blue>New</FONT> Customer 
   objCust.Load CustID 
   <FONT color=blue>Set</FONT> GetCustomer = objCust 
<FONT color=blue>End</FONT> <FONT color=blue>Function</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Trong VB.NET ta có thể dùng Return Statement để Return kết 
    quả của một Function thay vì dùng chính tên của Function. </P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Function</FONT> GetCustomer (<FONT color=blue>ByVal</FONT> CustID <FONT color=blue>As Long</FONT>) <FONT color=blue>As</FONT> Customer 
   <FONT color=blue>Dim</FONT> objCust <FONT color=blue>As</FONT> <FONT color=blue>New</FONT> Customer(CustID) 
   Return objCust 
<FONT color=blue>End</FONT> <FONT color=blue>Function</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><A name=Delegate><FONT 
    face=Arial>
    <H3 align=justify><FONT color=blue size=2>Delegate</FONT></H3>
    <P align=justify><B><FONT size=2>Delegate</FONT></B><FONT size=2> là một 
    cách giúp ta pass một procedure như một parameter vào trong một method. Ý 
    niệm nầy được gọi là <B>Function Pointer</B> hay <B>Callback</B>. Một trường 
    hợp cổ điển ta dùng Delegate là cung cấp một dataArray để sort với một 
    Function để so sánh mỗi hai items trong array.<BR><BR>Trong VB.NET ta dùng 
    <B>AddressOf</B> operator để pass một procedure. Ta declare một Delegate 
    bằng cách nói nó là một procedure dưới dạng nào, có bao nhiêu parameters, 
    mỗi parameter thuộc loại data type nào. Thí dụ:</FONT></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Delegate Function</FONT> IsGreater (<FONT color=blue>ByVal</FONT> v1 <FONT color=blue>As</FONT> Integer, <FONT color=blue>ByVal</FONT> v2 <FONT color=blue>As</FONT> Integer) as <FONT color=blue>Boolean</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Khi viết code ta cứ yên tâm sẽ được cung cấp một Function 
    có dạng ấy và đại khái code như sau:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Sub</FONT> DoSort (<FONT color=blue>ByRef</FONT> DataArray() <FONT color=blue>As</FONT> Integer, Greater <FONT color=blue>As</FONT> IsGreater) 
   <FONT color=blue>Dim</FONT> outer <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
   <FONT color=blue>Dim</FONT> inner <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
   <FONT color=blue>Dim</FONT> temp <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> 
   <FONT color=blue>For</FONT> outer = 0 <FONT color=blue>To</FONT> UBound(DataArray) 
      <FONT color=blue>For</FONT> inner = outer + 1 <FONT color=blue>To</FONT> UBound(DataArray) 
         <FONT color=blue>If</FONT> GreaterThan.Invoke( DataArray(outer), DataArray(inner)) <FONT color=blue>Then</FONT> 
            temp = DataArray(outer) 
            DataArray(outer) = DataArray(inner) 
            DataArray(inner) = temp 
         <FONT color=blue>End</FONT> <FONT color=blue>If</FONT> 
      <FONT color=blue>Next</FONT> 
   <FONT color=blue>Next</FONT> 
<FONT color=blue>End</FONT> <FONT color=blue>Sub</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Để ý cách dùng <B>Method Invoke</B> để gọi một Delegate. 
    Bây giờ ta chỉ cần cung cấp Delegate routine mà ta đã hứa:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Public</FONT> <FONT color=blue>Function</FONT> myIsGreater (<FONT color=blue>ByVal</FONT> v1 <FONT color=blue>As</FONT> Integer, <FONT color=blue>ByVal</FONT> v2 <FONT color=blue>As</FONT> Integer) as <FONT color=blue>Boolean</FONT> 
   <FONT color=blue>Return</FONT> ( v1 &gt; v2) 
<FONT color=blue>End</FONT> <FONT color=blue>Function</FONT> 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Tiếp theo đây là cách ta dùng Delegate nói 
    trên:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial><FONT color=blue>Dim</FONT> myData() <FONT color=blue>As</FONT> <FONT color=blue>Integer</FONT> = { 2, 5, 8, 13, 26} <BR>
DoSort (myData, <FONT color=blue>AddressOf</FONT> myIsGreater) 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Khi một Subscriber registers với một Publisher một routine 
    để Handle một loại Event, ta cũng dùng delegate như sau:<BR></P></FONT>
    <TABLE bgColor=#f6f6f6>
      <TBODY>
      <TR>
        <TD><FONT size=3>
          <DIV align=justify><PRE><FONT face=Arial>AddHandler Button4.Click, <FONT color=blue>AddressOf</FONT> Button4_Click 
</FONT></PRE></DIV></FONT></TD></TR></TBODY></TABLE><FONT face=Arial size=2>
    <P align=justify>Khi một Event Click xãy ra ở Button4, system sẽ execute Sub 
    Button4_Click. </P></FONT></A><!-- End of Cut and paste content --><!-- Start of bottom bar for copyright notice etc --><!-- End of Cut and paste content --><!-- Start of bottom bar for copyright notice etc -->
    <TABLE class=clsNavLinks id=tblFooterLinks cellSpacing=0 cellPadding=0 
    width="100%" border=0>
      <TBODY>
      <TR>
        <TD class=clsRaised width=785 bgColor=#6699cc colSpan=5>
          <P align=justify><FONT face=Arial color=#ffffff size=2>Vovisoft © 
          2000. All rights reserved.</FONT></P></TD></TR>
      <TR>
        <TD width=256>
          <P align=justify><FONT face=Arial size=2>&nbsp;&nbsp; Last Updated: <!--webbot 
      bot="Timestamp" S-Type="REGENERATED" S-Format="%d %b %Y" startspan -->05 
          th3 2002<!--webbot 
      bot="Timestamp" endspan i-checksum="13298" --> </FONT></P></TD>
        <TD width=181>
          <P align=justify><FONT face=Arial size=2></FONT>&nbsp;</P></TD>
        <TD width=258>
          <P align=justify><FONT face=Arial size=2><A 
          href="mailto:dixon@vovisoft.com">Webmaster</A></FONT></P></TD></TR></TBODY></TABLE></BLOCKQUOTE></BLOCKQUOTE></FONT>
<HR>

<P align=center><FONT face="Times New Roman"><B><FONT color=#ff0000>PcLeHoan 
1996 - 2002</FONT><FONT face=.VnTime size=2><BR></FONT></B></FONT><FONT 
face="Times New Roman" size=2><B>Mirror </B>: <A 
href="http://www.pclehoan.com/andi/ndc.htm">http://www.pclehoan.com/andi/ndc.htm</A><BR><B>Mirror 
</B>: <A 
href="http://www.lehoanpc.net/andi/ndc.htm">http://www.lehoanpc.net/andi/ndc.htm</A></FONT><BR><FONT 
face="Times New Roman" size=2><B>Mirror </B>: <A 
href="http://www.ktlehoan.com/">http://www.ktlehoan.com/</A></FONT></P>
<P align=center><A target=_top 
href="http://member.bcentral.com/cgi-bin/fc/fastcounter-login?2828564"><IMG 
src="3_files/digits.gif" border=0></A> </P></BODY></HTML>
